package com.leo.db;

import com.leo.common.MybatisUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.session.SqlSession;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * @BelongsProject: leo-emailfx
 * @BelongsPackage: com.leo.db
 * @Author: wangss
 * @CreateTime: 2023-02-13  22:16
 * @Description: 每个线程都应该有它自己的 SqlSession 实例  反射动态代理
 * @Version: 1.0
 */
@Slf4j
public class MapperInterceptor<T> implements InvocationHandler {

    /**
     * @description: jdk 动态代理
     * @author: wangss
     * @date: 2023/2/13 23:17
     * @param: proxy jdk创建的代理对象，无需赋值
     * @param: method 目标类中的方法
     * @param: objects 目标类中方法的参数
     * @return: java.lang.Object
     **/
    @Override
    public Object invoke(Object proxy, Method method, Object[] objects) throws Throwable {
        // 这里执行完会自动释放资源
        try (SqlSession session = MybatisUtils.getSqlSessionFactory().openSession(true)) {
            log.info("----------------代理开始---------------");
            log.info("--------------------代理方法为:{}------------------", method);
            Class<?> c = method.getDeclaringClass();
            T dao = (T) session.getMapper(c);
            return method.invoke(dao, objects);
        }
    }
}